2616. Потерянная карточка

 

Для настольной игры используются карточки с номерами от 1 до n (натуральное число n не превышает 106). Одна карточка потерялась. Найдите ее.

 

Вход.  Первым задано число n. Далее следуют n – 1 номер оставшихся карточек.

 

Выход. Выведите номер потерянной карточки.

 

Пример входа

Пример выхода

5 1 2 3 4

5

 

 

РЕШЕНИЕ

математика – XOR

 

Анализ алгоритма

Решим задачу без использования массивов. Вычислим xor операцию над всеми числами от 1 до n, получив некоторый результат res. Далее произведем операцию xor числа res со всеми номерами оставшихся карточек. В результате получится номер потерянной карточки.

 

Второе решение. Вычислим сумму всех чисел от 1 до n. По формуле арифметической прогрессии она равна res = (1 + n) * n / 2. Вычтем из res номера всех карточек, имеющихся в наличии. После выполнения всех вычитаний res будет содержать номер потерянной карточки.

 

Пример

Для заданного примера n = 5. Сумма всех натуральных чисел от 1 до 5 равна

res = (1 + 5) * 5 / 2 = 15

Вычтем из res номера оставшихся 4 карточек: 15 – 1 – 2 – 3 – 4 = 5. Получили 5 – номер потерянной карточки.

 

Реализация алгоритма

Читаем входные данные. В переменной res вычислим xor операцию над всеми числами от 1 до n.

 

scanf("%d",&n); res = 0;

for(i = 1; i <= n; i++) res ^= i;

 

Читаем номера оставшихся карточек и совершаем операцию xor их со значением res.

 

for(i = 1; i < n; i++)

{

  scanf("%d",&val);

  res ^= val;

}

 

Выводим ответ.

 

printf("%d\n",res);

 

Реализация алгоритма – объединение циклов

 

#include <stdio.h>

 

int i, n, val, res;

 

int main(void)

{

  scanf("%d",&n); res = n;

  for(i = 1; i < n; i++)

  {

    scanf("%d",&val);

    res ^= val ^ i;

  }

  printf("%d\n",res);

}

 

Java реализация Scanner, TLE 1.4 sec

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);   

    int i, n = con.nextInt(), res = 0;

    for(i = 1; i <= n; i++)

      res ^= i;

    for(i = 1; i < n; i++)

    {

      int val = con.nextInt();

      res ^= val;

    }

    System.out.println(res);

    con.close();

  }

}   

 

Java реализация FastScanner, 0.4 sec

 

import java.util.*;

import java.io.*;

 

class FastScanner

{

  private BufferedReader br;

  private StringTokenizer st;

 

  public FastScanner(InputStreamReader reader)

  {

    br = new BufferedReader(reader);

  }

 

  public String next()

  {

    while (st == null || !st.hasMoreTokens())

    {

      try

      {

        st = new StringTokenizer(br.readLine());

      } catch (Exception e)

      {

        e.printStackTrace();

      }

    }

    return st.nextToken();

  }

 

  public int nextInt()

  {

    return Integer.parseInt(next());

  }

 

  public double nextDouble()

  {

    return Double.parseDouble(next());

  }

 

  public void close() throws Exception

  {

    br.close();

  }

}

 

public class Main

{

  public static void main(String[] args)

  {

    FastScanner con =

      new FastScanner(new InputStreamReader(System.in));   

    int i, n = con.nextInt(), res = 0;

    for(i = 1; i <= n; i++)

      res ^= i;

    for(i = 1; i < n; i++)

    {

      int val = con.nextInt();

      res ^= val;

    }

    System.out.println(res);

  }

}